package com.game.service.impl;

import java.util.List;
import java.util.Map;

import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.inject.Inject;

import com.game.dao.IGameDao;
import com.game.dao.IGameRoundDao;
import com.game.dao.IUserDao;
import com.game.pojo.Game;
import com.game.pojo.GameRound;
import com.game.pojo.User;
import com.game.service.IGameService;
import com.game.util.GameUtils;
/**
 * 猜数字游戏的service类
 * @author Administrator
 *
 */
@Stateless
@Local(IGameService.class)
public class GameService implements IGameService {
	
	@Inject private IUserDao userDao;
	@Inject private IGameDao gameDao;
	@Inject private IGameRoundDao gameRoundDao;
	
	/**
	 * “猜数字”游戏处理逻辑
	 * 
	 * @param request 请求对象
	 * @param openId 用户的OpenID
	 * @param content 消息内容
	 * @return
	 */
	public String processGame(String openId, String content) {
		// 获取用户最近一次创建的游戏
		Game game = gameDao.getLastGameByOpenId(openId);
		// 本局游戏的正确答案
		String gameAnswer = null;
		// 本回合的猜测结果
		String guessResult = null;
		// 本局游戏的id
		int gameId = -1;
		// 是否是新的一局（默认为false）
		boolean newGameFlag = (null == game || 0 != game.getGameStatus());
		// 新的一局
		if (newGameFlag) {
			// 生成不重复的4位随机数作为答案
			gameAnswer = GameUtils.generateRandNumber();
			// 计算本回合“猜数字”的结果（xAyB）
			guessResult = GameUtils.guessResult(gameAnswer, content);
			// 创建game
			game = new Game();
			User user = userDao.getUserByOpenId(openId);
			game.setUser(user);
			game.setGameAnswer(gameAnswer);
			game.setCreateTime(GameUtils.getStdDate());
			game.setGameStatus(0);
			// 保存game并获取id
			gameId = gameDao.saveGame(game);
		}
		// 不是新的一局
		else {
			gameAnswer = game.getGameAnswer();
			guessResult = GameUtils.guessResult(game.getGameAnswer(), content);
			gameId = game.getGameId();
		}
		// 保存当前游戏回合
		GameRound gameRound = new GameRound();
		gameRound.setGame(gameDao.getGameById(gameId));
		//gameRound.setOpenId(openId);
		gameRound.setGuessNumber(content);
		gameRound.setGuessTime(GameUtils.getStdDate());
		gameRound.setGuessResult(guessResult);
		gameRoundDao.saveGameRound(gameRound);
		// 查询本局游戏的所有回合
		List<GameRound> roundList = gameRoundDao.getGameRoundsByGid(gameId);
		// 遍历游戏回合，组装给用户回复的消息
		StringBuffer buffer = new StringBuffer();
		buffer.append("查看玩法请回复：help").append("\n");
		buffer.append("查看战绩请回复：score").append("\n");
		for (int i = 0; i < roundList.size(); i++) {
			gameRound = roundList.get(i);
			buffer.append(String.format("第%d回合： %s    %s", i + 1, gameRound.getGuessNumber(), gameRound.getGuessResult())).append("\n");
		}
		// 猜对
		if ("4A0B".equals(guessResult)) {
			buffer.append("正确答案：").append(gameAnswer).append("\n");
			buffer.append("恭喜您猜对了！[强]").append("\n");
			buffer.append("重新输入4个不重复的数字开始新的一局。");
			//修改游戏状态
			gameDao.updateGameById(gameId, 1, GameUtils.getStdDate());
		}
		// 10回合仍没猜对
		else if (roundList.size() >= 10) {
			buffer.append("正确答案：").append(gameAnswer).append("\n");
			buffer.append("唉，10回合都没猜出来，本局结束！[流泪]").append("\n");
			buffer.append("重新输入4个不重复的数字开始新的一局。");
			//修改游戏状态
			gameDao.updateGameById(gameId, 2, GameUtils.getStdDate());
		}
		// 本回合没猜对
		else {
			buffer.append("请再接再励！");
		}
		return buffer.toString();
	}
	
	
	/**
	 * “猜数字”游戏玩法
	 * 
	 * @return String
	 */
	public String getGameRule() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("《猜数字游戏玩法》").append("\n");
		buffer.append("系统设定一个没有重复数字的4位数，由玩家来猜，每局10次机会。").append("\n");
		buffer.append("每猜一次，系统会给出猜测结果xAyB，x表示数字与位置均正确的数的个数，y表示数字正确但位置不对的数的个数。").append("\n");
		buffer.append("玩家根据猜测结果xAyB一直猜，直到猜中(4A0B)为止。").append("\n");
		buffer.append("如果10次都没猜中，系统会公布答案，游戏结束。").append("\n");
		buffer.append("玩家任意输入一个没有重复数字的4位数即开始游戏，例如：7890");
		return buffer.toString();
	}
	
	/**
	 * “猜数字”游戏玩法,带有提示语句的
	 * 
	 * @return String
	 */
	public String getGameRuleAndHead() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("=========注意=========").append("\n");
		buffer.append("本公众号仅为本人测试练手之用，大牛请无视，不喜勿喷").append("\n");
		buffer.append("=======/呲牙 /呲牙 /呲牙 ========").append("\n");
		buffer.append("《猜数字游戏玩法》").append("\n");
		buffer.append("系统设定一个没有重复数字的4位数，由玩家来猜，每局10次机会。").append("\n");
		buffer.append("每猜一次，系统会给出猜测结果xAyB，x表示数字与位置均正确的数的个数，y表示数字正确但位置不对的数的个数。").append("\n");
		buffer.append("玩家根据猜测结果xAyB一直猜，直到猜中(4A0B)为止。").append("\n");
		buffer.append("如果10次都没猜中，系统会公布答案，游戏结束。").append("\n");
		buffer.append("玩家任意输入一个没有重复数字的4位数即开始游戏，例如：7890");
		return buffer.toString();
	}

	/**
	 * “猜数字”游戏战绩
	 * 
	 * @param request 请求对象
	 * @param openId 用户的OpenID
	 * @return
	 */
	public String getUserScore( String openId) {
		StringBuffer buffer = new StringBuffer();
		Map<Integer, Long> scoreMap = gameDao.getScoreByOpenId(openId);
		
		if (null == scoreMap || 0 == scoreMap.size()) {
			buffer.append("您还没有玩过猜数字游戏！").append("\n");
			buffer.append("请输入4个不重复的数字开始新的一局，例如：0269");
		} else {
			buffer.append("您的游戏战绩如下：").append("\n");
			for (Integer status : scoreMap.keySet()) {
				if (0L == status) {
					buffer.append("游戏中：").append(scoreMap.get(status)).append("\n");
				} else if (1L == status) {
					buffer.append("胜利局数：").append(scoreMap.get(status)).append("\n");
				} else if (2L == status) {
					buffer.append("失败局数：").append(scoreMap.get(status)).append("\n");
				}
			}
			buffer.append("请输入4个不重复的数字开始新的一局，例如：0269");
		}
		return buffer.toString();
	}
	
	/**
	 * 开始一局新的游戏
	 * @param openId
	 * @return
	 */
	@Override
	public String startNewGame(String openId){
		StringBuffer buffer = new StringBuffer();
		// 获取用户最近一次创建的游戏
		Game game = gameDao.getLastGameByOpenId(openId);
		// 本局游戏的正确答案
		String gameAnswer = null;
		// 本回合的猜测结果
		String guessResult = null;
		// 本局游戏的id
		int gameId = -1;
		// 是否是新的一局（默认为false）
		boolean newGameFlag = (null == game || 0 != game.getGameStatus());
		// 新的一局
		if (newGameFlag) {
			// 生成不重复的4位随机数作为答案
			gameAnswer = GameUtils.generateRandNumber();
			// 创建game
			game = new Game();
			User user = userDao.getUserByOpenId(openId);
			game.setUser(user);
			game.setGameAnswer(gameAnswer);
			game.setCreateTime(GameUtils.getStdDate());
			game.setGameStatus(0);
			// 保存game并获取id
			gameId = gameDao.saveGame(game);
			buffer.append("新的游戏已开始").append("\n");
			buffer.append("请您输入一个不重复的4位数字").append("\n");
			buffer.append("例如：1234");
		}
		// 不是新的一局
		else {
			buffer.append("您上局游戏还没结束哦").append("\n").append("请您输入一个不重复的4位数字继续上局游戏").append("\n")
					.append("例如：1234");
		}
		return buffer.toString();
	}
}
